還記得 Collection Types 中的 Set 以及 Dictionary 嗎?
在這兩個無序排列的型別中,是不允許存在兩個相同的 Element,否則就會發生錯誤,但是又是怎麼知道是否有兩個相同的 Element?
在官方文件中,在說明 Set 中有一段話:
A type must be hashable in order to be stored in a set—that is, the type must provide a way to compute a hash value for itself.
在 Hashable Protocol Document 中也提到了這段話:
You can use any type that conforms to the Hashable protocol in a set or as a dictionary key
我們可以知道,原來只有遵從 Hashable Protocol 的型別,才可以被放入 Set 或是當成 Dictionary Key,其實很多常見的型別都實作了這個協定,像是 String、Int、Float、Double 以及 Boolean ,甚至是 Array 都遵循了 Hashable Protocol。
只要實作 Hashable Protocol,他會依照本身的資料內容,產生一個隨機整數型別的 Hash 值( 所以可能每一次 Print 的結果不同 ),它提供了一個實體屬性 hashValue
,所以假定今天有兩個變數:a
和 b
,若 a == b
,則 a.hashValue == b.hashValue
。
let a = "測試"
let b = "測試"
print(a.hashValue) // -2082269075308414048
print(b.hashValue) // -2082269075308414048
print(a == b) // true
print(a.hashValue == b.hashValue) // true
let a = "測試1"
let b = "測試2"
print(a.hashValue) // 480433398084574967
print(b.hashValue) // 7580141589794196104
print(a == b) // false
print(a.hashValue == b.hashValue) // false
所以在 Set 以及 Dictionary 中,就是利用 Hash Value 來判斷是否有重複的 Element,這樣對於 Set 及 Dictionary 的使用就很安全。